Mon, 11 Jan 1999 08:09:08 +0100 Paolo Molaro <lupus@debian.org>
authorPaolo Molaro <lupus@src.gnome.org>
Mon, 11 Jan 1999 07:09:07 +0000 (07:09 +0000)
committerPaolo Molaro <lupus@src.gnome.org>
Mon, 11 Jan 1999 07:09:07 +0000 (07:09 +0000)
        * gtk/gtktypeutils.[ch]: add gtk_type_{add,remove}_creation_hook().
        You can have a notification when a type is created.

ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtktypeutils.c
gtk/gtktypeutils.h

index 66310e7384f087a31f6e8c294797bbe31dfc7a0d..719cd4798399b89febf0cfa6580610c39839c935 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon, 11 Jan 1999 08:09:08 +0100 Paolo Molaro <lupus@debian.org>
+
+       * gtk/gtktypeutils.[ch]: add gtk_type_{add,remove}_creation_hook().
+       You can have a notification when a type is created.
+
 1999-01-11  Tim Janik  <timj@gtk.org>
 
        * gtk/gtkmain.c (gtk_propagate_event): added an assertement.
index 66310e7384f087a31f6e8c294797bbe31dfc7a0d..719cd4798399b89febf0cfa6580610c39839c935 100644 (file)
@@ -1,3 +1,8 @@
+Mon, 11 Jan 1999 08:09:08 +0100 Paolo Molaro <lupus@debian.org>
+
+       * gtk/gtktypeutils.[ch]: add gtk_type_{add,remove}_creation_hook().
+       You can have a notification when a type is created.
+
 1999-01-11  Tim Janik  <timj@gtk.org>
 
        * gtk/gtkmain.c (gtk_propagate_event): added an assertement.
index 66310e7384f087a31f6e8c294797bbe31dfc7a0d..719cd4798399b89febf0cfa6580610c39839c935 100644 (file)
@@ -1,3 +1,8 @@
+Mon, 11 Jan 1999 08:09:08 +0100 Paolo Molaro <lupus@debian.org>
+
+       * gtk/gtktypeutils.[ch]: add gtk_type_{add,remove}_creation_hook().
+       You can have a notification when a type is created.
+
 1999-01-11  Tim Janik  <timj@gtk.org>
 
        * gtk/gtkmain.c (gtk_propagate_event): added an assertement.
index 66310e7384f087a31f6e8c294797bbe31dfc7a0d..719cd4798399b89febf0cfa6580610c39839c935 100644 (file)
@@ -1,3 +1,8 @@
+Mon, 11 Jan 1999 08:09:08 +0100 Paolo Molaro <lupus@debian.org>
+
+       * gtk/gtktypeutils.[ch]: add gtk_type_{add,remove}_creation_hook().
+       You can have a notification when a type is created.
+
 1999-01-11  Tim Janik  <timj@gtk.org>
 
        * gtk/gtkmain.c (gtk_propagate_event): added an assertement.
index 66310e7384f087a31f6e8c294797bbe31dfc7a0d..719cd4798399b89febf0cfa6580610c39839c935 100644 (file)
@@ -1,3 +1,8 @@
+Mon, 11 Jan 1999 08:09:08 +0100 Paolo Molaro <lupus@debian.org>
+
+       * gtk/gtktypeutils.[ch]: add gtk_type_{add,remove}_creation_hook().
+       You can have a notification when a type is created.
+
 1999-01-11  Tim Janik  <timj@gtk.org>
 
        * gtk/gtkmain.c (gtk_propagate_event): added an assertement.
index 66310e7384f087a31f6e8c294797bbe31dfc7a0d..719cd4798399b89febf0cfa6580610c39839c935 100644 (file)
@@ -1,3 +1,8 @@
+Mon, 11 Jan 1999 08:09:08 +0100 Paolo Molaro <lupus@debian.org>
+
+       * gtk/gtktypeutils.[ch]: add gtk_type_{add,remove}_creation_hook().
+       You can have a notification when a type is created.
+
 1999-01-11  Tim Janik  <timj@gtk.org>
 
        * gtk/gtkmain.c (gtk_propagate_event): added an assertement.
index 66310e7384f087a31f6e8c294797bbe31dfc7a0d..719cd4798399b89febf0cfa6580610c39839c935 100644 (file)
@@ -1,3 +1,8 @@
+Mon, 11 Jan 1999 08:09:08 +0100 Paolo Molaro <lupus@debian.org>
+
+       * gtk/gtktypeutils.[ch]: add gtk_type_{add,remove}_creation_hook().
+       You can have a notification when a type is created.
+
 1999-01-11  Tim Janik  <timj@gtk.org>
 
        * gtk/gtkmain.c (gtk_propagate_event): added an assertement.
index 1d3fed1c1a61a814a838ad3a824a7b65058dc237..dc33bc84d980d4d86e3d148f4e60df382be68049 100644 (file)
@@ -37,7 +37,6 @@ struct _GtkTypeNode
   GMemChunk *mem_chunk;
 };
 
-
 #define        LOOKUP_TYPE_NODE(node_var, type)        { \
     GtkTypeNode *__node = NULL; \
     GtkType sqn = GTK_TYPE_SEQNO (type); \
@@ -66,6 +65,7 @@ static guint      n_type_nodes = 0;
 static guint       n_ftype_nodes = 0;
 static GHashTable  *type_name_2_type_ht = NULL;
 
+static GHookList *creation_hook_list = NULL;
 
 static GtkTypeNode*
 gtk_type_node_next_and_invalidate (GtkType parent_type)
@@ -228,6 +228,15 @@ gtk_type_create (GtkType      parent_type,
   return new_node->type;
 }
 
+static gboolean
+gtk_creation_marshaller (GHook* hook, gpointer data)
+{
+  GtkTypeQuery *query = (GtkTypeQuery*) data;
+  GtkCreationHook func = hook->func;
+  
+  return func(query, hook->data);
+}
+
 GtkType
 gtk_type_unique (GtkType      parent_type,
                 const GtkTypeInfo *type_info)
@@ -253,7 +262,17 @@ gtk_type_unique (GtkType      parent_type,
   
   if (!new_type)
     g_free (type_name);
-  
+  else if ( creation_hook_list )
+    {
+      GtkTypeQuery data;
+      data.type = new_type;
+      data.type_name = type_name;
+      data.object_size = type_info->object_size;
+      data.class_size = type_info->class_size;
+
+      g_hook_list_marshal_check(creation_hook_list, FALSE, gtk_creation_marshaller, &data);
+    }
+
   return new_type;
 }
 
@@ -1015,3 +1034,40 @@ gtk_identifier_get_type (void)
   
   return identifier_type;
 }
+
+guint
+gtk_type_add_creation_hook (GtkCreationHook hook_func,
+                            gpointer        data,
+                            GDestroyNotify  destroy)
+{
+  static guint seq_id =1;
+  GHook * hook;
+  
+  g_return_val_if_fail(hook_func != NULL, 0);
+
+  if (!creation_hook_list)
+    {
+      creation_hook_list = g_new(GHookList, 1);
+      g_hook_list_init(creation_hook_list, sizeof(GHook));
+    }
+
+  hook = g_hook_alloc (creation_hook_list);
+  hook->data = data;
+  hook->func = hook_func;
+  hook->destroy = destroy;
+
+  creation_hook_list->seq_id = seq_id;
+  g_hook_prepend(creation_hook_list, hook);
+  seq_id = creation_hook_list->seq_id;
+
+  return hook->hook_id;
+}
+
+void
+gtk_type_remove_creation_hook (guint hook_id)
+{
+  g_return_if_fail(hook_id != 0);
+
+  if (!creation_hook_list || !g_hook_destroy(creation_hook_list, hook_id))
+    g_warning("gtk_type_remove_creation_hook(): could not find hook (%u)", hook_id);
+}
index 42bf9d809322a7987c3cc33c8da31071414c9e83..5b42840ce52158abc1e6e90d8dcea789a7991a9e 100644 (file)
@@ -153,7 +153,8 @@ typedef void (*GtkSignalMarshaller) (GtkObject      *object,
                                     GtkSignalFunc   func,
                                     gpointer        func_data,
                                     GtkArg         *args);
-
+typedef gboolean (*GtkCreationHook) (GtkTypeQuery   *type_info,
+                                     gpointer        data);
 
 /* deprecated */
 typedef void (*GtkArgGetFunc)     (GtkObject*, GtkArg*, guint);
@@ -362,7 +363,10 @@ GtkType            gtk_type_get_varargs_type       (GtkType        foreign_type);
  */
 GtkTypeQuery*  gtk_type_query                  (GtkType        type);
 
-
+guint           gtk_type_add_creation_hook      (GtkCreationHook hook,
+                                                 gpointer        data,
+                                                 GDestroyNotify  destroy);
+void            gtk_type_remove_creation_hook   (guint           hook_id);